/**
 * Express web 框架的应用模块
 * 1.导入所需模块
 * 2.导入路由模块
 * 3.应用层中间件
 * 4.定义路由
 * 5.导出Express应用模块
 */

//1.导入所需模块
var express = require('express');
//导入Node.js路径模块
var path = require('path');
//导入cookie解析中间件
var cookieParser = require('cookie-parser');
//导入日志模块
var logger = require('morgan');


//导入session模块
const session=require('express-session');
//导入Session存储支持的模块Sqlite
const SqliteStore=require('connect-sqlite3')(session);

//导入Swagger-ui-express模块
const swaggerui=require('swagger-ui-express');
//导入Swagger-jsdoc模块
const swaggerJsdoc=require('swagger-jsdoc');
//导入初始化数据库中间件
const initsqlitedb=require('./controller/init');


//2.导入路由模块
//默认路由
var indexRouter = require('./routes/index');
//用户路由
var usersRouter = require('./routes/users');
//导入设备借用路由
const deviceRouter=require('./routes/deviceborrow');
//导入设备信息路由
const devicesRouter=require('./routes/device');
//导入设备分类路由
const CateRoutes = require('./routes/deviceCategory');
//导入设备评价路由
const deviceFeedbackRouter = require('./routes/deviceFeedback');

//生成应用实例app
var app = express();

//3.应用层中间件
//开发日志
app.use(logger('dev'));
//JSON 解析中间件
app.use(express.json());
//Url encoded 解析中间件
app.use(express.urlencoded({ extended: false }));
//cookie解析中间件
app.use(cookieParser());
//静态文件托管中间件
app.use(express.static(path.join(__dirname, 'public')));


//中间件:swagger
const options={
    definition:{
        openapi:"3.0.0",
        info:{
            title:"我的实验室接口",
            version:"1.0.0"
        },
    },
    apis:[path.join(__dirname,'./routes/*.js')]
};


const openapiSpec=swaggerJsdoc(options);
app.use("/dev-api",swaggerui.serve,swaggerui.setup(openapiSpec));
//中间件：数据库初始化
app.use(initsqlitedb());


/**
 * EXpress中的Session支持
 * 1.npm install express-session connect-sqlite3
 * 2.导入模块
 * 3.使用Session中间件
 * 4.session存储：sqlite3
 */

app.use(
    session({
      secret: "s$dks@df2", //session的salt
      resave: false, //session工作方式：session是否重新保存
      saveUninitialized: true, //session工作方式：未初始化的session是否保存
      cookie: { maxAge: 7 * 24 * 60 * 60 * 1000 }, // sessionID在客户端cookie中保存1周
      store: new SqliteStore({
        dir: "./data",
        db: "mylab.db",
      }),
    })
  );

//4.定义路由
//默认路由
app.use('/', indexRouter);
//用户路由
app.use('/users', usersRouter);
//设备借用路由
app.use("/deuse",deviceRouter)
//设备信息路由
app.use("/device",devicesRouter)
//设备类别路由
app.use("/category",CateRoutes);
//设备评价路由
app.use("/deviceFeedback",deviceFeedbackRouter);


//5.导出Express应用模块
module.exports = app;
